package etm.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import upc.condominio.modelo.Residente;
import upc.condominio.modelo.Usuario;
import upc.condominio.util.ConexionBD;
import etm.excepcion.DAOExcepcion;
import etm.excepcion.LoginExcepcion;
import etm.negocio.GestionResidente;

public class UsuarioDAO extends BaseDAO {

	public Usuario obtenerPorIdUsuario(int idUsuario) throws DAOExcepcion {
		String query = "select idUsuario,cuenta,password,tipo,correo,idResidente from usuario where idUsuario=?";
		Usuario usuario = new Usuario();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idUsuario);
			rs = stmt.executeQuery();
			if (rs.next()) {
				usuario.setIdUsuario(rs.getInt("idUsuario"));
				usuario.setCuenta(rs.getString("cuenta"));
				usuario.setPassword(rs.getString("password"));
				usuario.setTipo(rs.getString("tipo"));
				usuario.setCorreo(rs.getString("correo"));
				
				ResidenteDAO dao=new ResidenteDAO();
				usuario.setResidente(dao.buscarporId(rs.getInt("idResidente")));
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return usuario;
	}
	
	public Usuario obtenerPorCorreo(String correo) throws DAOExcepcion {
		Usuario res =null;	
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			String StrQuery = 	"select idUsuario,cuenta,password,tipo,correo,idResidente from usuario where correo=?";			
			stmt = con.prepareStatement(StrQuery);
			stmt.setString(1, correo);
			rs = stmt.executeQuery();
			while (rs.next()) {
				res = new Usuario();
				res.setIdUsuario(rs.getInt("idUsuario"));
				res.setCuenta(rs.getString("cuenta"));
				res.setPassword(rs.getString("password"));
				res.setTipo(rs.getString("tipo"));
				res.setCorreo(rs.getString("correo"));
				ResidenteDAO dao=new ResidenteDAO();
				res.setResidente(dao.buscarporId(rs.getInt("idResidente")));
			break;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return res;
	}

//	public Collection<Usuario> buscarPorNombre(String nombre)
//			throws DAOExcepcion {
//		String query = "select id_usuario,clave,nombres,paterno,materno,correo,direccion,telefono,estado "
//				+ " from usuario where nombres like ?";
//		Collection<Usuario> c = new ArrayList<Usuario>();
//		Connection con = null;
//		PreparedStatement stmt = null;
//		ResultSet rs = null;
//		try {
//			con = ConexionBD.obtenerConexion();
//			stmt = con.prepareStatement(query);
//			stmt.setString(1, "%" + nombre + "%");
//			rs = stmt.executeQuery();
//			while (rs.next()) {
//				Usuario vo = new Usuario();
//				vo.setIdUsuario(rs.getString("id_usuario"));
//				vo.setClave(rs.getString("clave"));
//				vo.setNombres(rs.getString("nombres"));
//				vo.setPaterno(rs.getString("paterno"));
//				vo.setMaterno(rs.getString("materno"));
//				vo.setCorreo(rs.getString("correo"));
//				vo.setDireccion(rs.getString("direccion"));
//				vo.setTelefono(rs.getString("telefono"));
//				vo.setEstado(rs.getString("estado"));
//				c.add(vo);
//			}
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
//		} finally {
//			this.cerrarResultSet(rs);
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
//		return c;
//	}

//	public Usuario insertar(Usuario vo) throws DAOExcepcion {
//		String query = "INSERT INTO usuario (id_usuario,clave,nombres,paterno,materno,correo,direccion, telefono,estado) "
//				+ "VALUES (?,?,?,?,?,?,?,?,?)";
//		System.err.println(query);
//		Connection con = null;
//		PreparedStatement stmt = null;
//		try {
//			con = ConexionBD.obtenerConexion();
//			stmt = con.prepareStatement(query);
//			stmt.setString(1, vo.getIdUsuario());
//			stmt.setString(2, vo.getClave());
//			stmt.setString(3, vo.getNombres());
//			stmt.setString(4, vo.getPaterno());
//			stmt.setString(5, vo.getMaterno());
//			stmt.setString(6, vo.getCorreo());
//			stmt.setString(7, vo.getDireccion());
//			stmt.setString(8, vo.getTelefono());
//			stmt.setString(9, vo.getEstado());
//
//			int i = stmt.executeUpdate();
//			if (i != 1) {
//				throw new SQLException("No se pudo insertar");
//			}
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
//		} finally {
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
//		return vo;
//	}

//	public Usuario actualizar(Usuario vo) throws DAOExcepcion {
//		String query = "UPDATE usuario SET clave=?, nombres=?, paterno=?, materno=?, correo=?, direccion=?,"
//				+ " telefono=?, estado=? WHERE id_usuario=?";
//		Connection con = null;
//		PreparedStatement stmt = null;
//		try {
//			con = ConexionBD.obtenerConexion();
//			stmt = con.prepareStatement(query);
//			stmt.setString(1, vo.getClave());
//			stmt.setString(2, vo.getNombres());
//			stmt.setString(3, vo.getPaterno());
//			stmt.setString(4, vo.getMaterno());
//			stmt.setString(5, vo.getCorreo());
//			stmt.setString(6, vo.getDireccion());
//			stmt.setString(7, vo.getTelefono());
//			stmt.setString(8, vo.getEstado());
//			stmt.setString(9, vo.getIdUsuario());
//
//			int i = stmt.executeUpdate();
//			if (i != 1) {
//				throw new SQLException("No se pudo actualizar");
//			}
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
//		} finally {
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
//		return vo;
//	}

//	public void eliminar(String idUsuario) throws DAOExcepcion {
//		String query = "DELETE FROM usuario WHERE id_usuario=?";
//		Connection con = null;
//		PreparedStatement stmt = null;
//		try {
//			con = ConexionBD.obtenerConexion();
//			stmt = con.prepareStatement(query);
//			stmt.setString(1, idUsuario);
//			int i = stmt.executeUpdate();
//			if (i != 1) {
//				throw new SQLException("No se pudo eliminar");
//			}
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
//		} finally {
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
//	}

//	public Collection<Usuario> listarTodos() throws DAOExcepcion {
//		String query = "select id_usuario,clave,nombres,paterno,materno,correo,direccion,telefono,estado"
//				+ " from usuario";
//		Collection<Usuario> c = new ArrayList<Usuario>();
//		Connection con = null;
//		PreparedStatement stmt = null;
//		ResultSet rs = null;
//		try {
//			con = ConexionBD.obtenerConexion();
//			stmt = con.prepareStatement(query);
//			rs = stmt.executeQuery();
//			while (rs.next()) {
//				Usuario vo = new Usuario();
//				vo.setIdUsuario(rs.getString("id_usuario"));
//				vo.setClave(rs.getString("clave"));
//				vo.setNombres(rs.getString("nombres"));
//				vo.setPaterno(rs.getString("paterno"));
//				vo.setMaterno(rs.getString("materno"));
//				vo.setCorreo(rs.getString("correo"));
//				vo.setDireccion(rs.getString("direccion"));
//				vo.setTelefono(rs.getString("telefono"));
//				vo.setEstado(rs.getString("estado"));
//				c.add(vo);
//			}
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
//		} finally {
//			this.cerrarResultSet(rs);
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
//		return c;
//	}

	public Usuario validar(String cuenta, String password) throws DAOExcepcion, LoginExcepcion {
		String query = "select idUsuario, cuenta, password, tipo, correo, idResidente from usuario where cuenta=? and password=?";
				
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Usuario usuario = new Usuario();
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, cuenta);
			stmt.setString(2, password);
			rs = stmt.executeQuery();

			if (rs.next()) {
				usuario.setIdUsuario(rs.getInt("idUsuario"));
				usuario.setCuenta(rs.getString("cuenta"));
				usuario.setPassword(rs.getString("password"));
				usuario.setTipo(rs.getString("tipo"));
				usuario.setCorreo(rs.getString("correo"));
				
				GestionResidente negResidente=new GestionResidente();
				Residente residente= negResidente.buscarPorId(rs.getInt("idResidente"));
				usuario.setResidente(residente);				
			} else {
				throw new LoginExcepcion("No existe");
			}
		} catch (LoginExcepcion e) {
			System.err.println(e.getMessage());
			throw new LoginExcepcion(e.getMessage());
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return usuario;
	}

}
